﻿/**
 * Name             :   MachineRegistryDb 
 * Namespace        :   HAS.Core.Registry.DataSource
 * Base Classe      :   RegistryDb
 * Type             :   class
 * Author           :   Hamza Saii
 * Creation         :   17/09/2014
 * Updated          :   17/09/2014
 * Licence          :   Public
 * Comment          :   C'est une classe qui hérite de RegistryDb, elle implémente les mêmes
 *                      fonctionnalités a part que cette classe ecrit réellement dans la base 
 *                      de registre HKEY_CURRENT_MACHINE
 * */
namespace HAS.Core.Registry.DataSource
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    /// <summary>
    /// Permet l'écriture des paramètres du modèles dans un dossier spécifique 
    /// du HKEY_LOCAL_MACHINE
    /// </summary>
    public class MachineRegistryDb : RegistryDb
    {

        /// <summary>
        /// Identifie les paramètres de regsitre à utiliser
        /// </summary>
        private Microsoft.Win32.RegistryKey CurrentReg { get; set; }
        
        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="model">un pointeure vers le modèle de données
        /// qui contient les informations à enregistrer</param>
        public MachineRegistryDb(Interfaces.IDataModel model)
            :base(model) { }

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="model">un pointeure vers le modèle de données
        /// qui contient les informations à enregistrer</param>
        /// <param name="registryParamNames">Liste des paramètres valide à enregistrer</param>
        public MachineRegistryDb(Interfaces.IDataModel model, List<string> registryParamNames)
            :base(model,registryParamNames) { }

        /// <summary>
        /// Représente l'action à executer lorsque l'un des property de la liste a changé
        /// </summary>
        /// <param name="sender">L'object déclanchant l'évement</param>
        /// <param name="e">Contient les propriétés d'identification de paramètres qui à changé</param>
        protected override void Model_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (RegistryParamNames == null)
                return;

            if (Model == null)
                return;

            string paramName = e.PropertyName.ToLower();
            if (RegistryParamNames.Contains(paramName))
            {
                string path = "Software\\" + System.AppDomain.CurrentDomain.FriendlyName + "\\";
                CurrentReg = Microsoft.Win32.Registry.LocalMachine;

                //Naviguer vers le dossier de l'application
                Microsoft.Win32.RegistryKey AppKey = CurrentReg.OpenSubKey(path, true);
                if (AppKey == null)
                {
                    CurrentReg.CreateSubKey(path);
                    AppKey = CurrentReg.OpenSubKey(path, true);
                }

                string modelName = Model.ToString();
                string[] names = modelName.Split('.');
                modelName = names[names.Length - 1];

                //Naviguer au classe name
                Microsoft.Win32.RegistryKey ClasseKey = AppKey.OpenSubKey(modelName, true);
                if (ClasseKey == null)
                {
                    AppKey.CreateSubKey(Model.ToString());
                    ClasseKey = AppKey.OpenSubKey(Model.ToString(), true);
                }

                string paramValue = Model.GetType().GetProperty(e.PropertyName).GetValue(Model, null).ToString();
                ClasseKey.SetValue(paramName, Model.GetType());

                ClasseKey.Close();
                AppKey.Close();
                CurrentReg.Close();
            }
        }
    }
}
